/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ia1_practica3;

import java.util.HashMap;

/**
 *
 * @author yojugracu
 */
public class Heuristica {
    private Matriz matriz;
    private Casilla casilla;
    HashMap<Integer, Casilla> mov;
    //NodoArbol raiz;
    Bitacora bitacora=new Bitacora();
    int x=0;
    int y=0;
    NodoArbol raiz = new NodoArbol(1,null,0,0,0,0);
    
    public void posibles_jugadas(int val,Matriz matriz,int posxmov,int posymov){
        this.matriz=matriz;
        casilla=matriz.getCasilla(posxmov,posymov);
        if (casilla.getTipoCasilla() != 0 && casilla.getTipoCasilla() != 1){
            mov = matriz.getPosiblesMov(posxmov,posymov);
            
            NodoHoja aux;
            
            for(int i=0;i<matriz.posiblesMovpunteo.size();i++){
                aux=matriz.posiblesMovpunteo.get(i);
                String y1=aux.posy<10?"0"+String.valueOf(aux.posy):String.valueOf(aux.posy);
                String x1=aux.posx<10?"0"+String.valueOf(aux.posx):String.valueOf(aux.posx);
                String valores=val+x1+y1;
                int id=Integer.parseInt(valores);
                System.out.println(valores+"****"+id+"***"+aux.punteo);
                agregar_nodo(1, id,aux.punteo,aux.casilla,aux.posx,aux.posy,posxmov,posymov);

            }

        }

    }
    
    public Jugada busquedas(){
        //busqueda_individual_profundidad(1305);
       // busqueda_individual_anchura(1305);
        best_first(true);
       // movimiento(raiz.Auxiliar.casilla);
        
        if(raiz.Auxiliar!=null && raiz.Auxiliar.casilla!=null){
            casilla=matriz.getCasilla(raiz.Auxiliar.aposx,raiz.Auxiliar.aposy);
            Casilla auxcasilla=raiz.Auxiliar.casilla;
            //Casilla auxcasilla=matriz.getCasilla(raiz.Auxiliar.posx,raiz.Auxiliar.posy);
            auxcasilla.setTipoCasilla(casilla.getTipoCasilla());
            casilla.setTipoCasilla(0);
            Jugada jugada = new Jugada(raiz.Auxiliar.aposx,raiz.Auxiliar.aposy,
                        raiz.Auxiliar.posx,raiz.Auxiliar.posy,2);
            return jugada;
        }
        return null;
    }
    
    public void movimiento(Casilla nueva){
        //Si es una ficha de un jugador cambia de estado
        if(nueva.getTipoCasilla() > casilla.EST_VACIAPRESS){
            //Si es par, entonces está vacía
            if(nueva.getTipoCasilla()%2==0){
                //Cambiando a una casilla llena
                nueva.setTipoCasilla(nueva.getTipoCasilla()+1);
                Main.getFormPrincipal().setCasillaSeleccionada(nueva);
            }else{
                nueva.setTipoCasilla(nueva.getTipoCasilla()-1);
                Main.getFormPrincipal().setCasillaSeleccionada(nueva);
            }

        }else{
            if(Main.getFormPrincipal().getCasillaSeleccionada() != null){
                Main.getFormPrincipal().setCasillaSeleccionada(nueva);
            }
        }
    }
    
    
            /*
     * Algoritmo de busqueda no informada profundidad
     */
    public void busqueda_individual_profundidad(int busco) {
        String encontrados = "";

        if (raiz != null) {
            encontrados += "*****Inicio Busqueda en Profundidad*****" + "\n";
            encontrados += "Buscando " + busco + "\n";
            //llamada da la funcion busqueda por profundidad de la clase NodoArbol
            encontrados += String.valueOf(raiz.busquedaProfundidad(busco)) + "\n";
            encontrados += raiz.encuentro + "\n";
        } else {
            encontrados = "No hay arbol generado";
        }
        System.out.println(encontrados);
    }

        public void busqueda_individual_anchura(int busco) {
        String encontrados = "";

        if (raiz != null) {
            encontrados += "\n*****Inicio Busqueda en Anchura*****" + "\n";
            encontrados += "Buscando " + busco+ "\n";
            //llamada da la funcion busqueda por anchura de la clase NodoArbol

            encontrados += String.valueOf(raiz.busquedaAnchura(busco)) + "\n";
            encontrados += raiz.encuentro + "\n";
        } else {
            encontrados = "No hay arbol generado";
        }
        System.out.println(encontrados);
    }
            /*
     * Algoritmo de busqueda informada Best first
     * @param max recibe como parametro max que identifica si se quiere maximizar o minimizar si es true se maximiza si es false se minimiza
     */
    public void best_first(boolean max) {
        String encontrados = "";
        //Realizando pruebas de búsqueda
        if (raiz != null) {
            //Busquedas en anchura
            encontrados += "\n*****Inicio Busqueda Informada Best-First *****" + "\n";
            encontrados += "Buscando " + 1305 + "\n";
            //llamada da la funcion busqueda deseada de la clase NodoArbol
            encontrados += String.valueOf(raiz.busquedaBestFirs(1, max)) + "\n";
            encontrados += raiz.encuentro + "\n";
        } else {
            encontrados = "No hay arbol generado";
        }
        
        System.out.println(encontrados+"-----------------");//------------"+raiz.Auxiliar.getpunteo());
    }
    public void agregar_nodo(int npadre, int nhijo,int punteo,Casilla cas, int posx,int posy, int aposx,int aposy){
        
        NodoArbol nodohijo = new NodoArbol(nhijo,cas,posx,posy,aposx,aposy);
        nodohijo.setpuntuacion(punteo);
        //nodohijo.setdistancia(Integer.parseInt(arbol[2]));
        if (raiz != null) {
            raiz.insertar_nodoArbol(npadre, nodohijo);
        } else {
            raiz = new NodoArbol(npadre,cas,posx,posy,aposx,aposy);
            raiz.addHijo(nodohijo);
        }
        
        //busqueda_individual_profundidad();
    }
}
